package com.kpx.app.base;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.kpx.app.Application;
import com.kpx.app.utils.TimeUtil;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.kpx.app.R;
import com.kpx.app.utils.uiutils.DisplayUtil;

import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 通用标签类ViewHolder
 *
 * @author chencong
 * @Description 此类需要不断添加设置方法去完善，如果没有需要的方法，可以自行添加
 * @date 2015年5月24日
 * @Copyright: Copyright (c) 2015 Shenzhen Tentinet Technology Co., Ltd. Inc. All rights reserved.
 */
public class ComViewHolder {
    /** 设置view是否可见:可见 */
    public static final int VISIBLE = 1;
    /** 设置view是否可见:不可见 */
    public static final int INVISIBLE = 2;
    /** 设置view是否可见:不在 */
    public static final int GONE = 3;
    /** 设置textview的上面图片 */
    public static final int DRAWABLE_TOP = 1;
    /** 设置textview的下面图片 */
    public static final int DRAWABLE_BOTTOM = 2;
    /** 设置textview的左面图片 */
    public static final int DRAWABLE_LEFT = 3;
    /** 设置textview的右面图片 */
    public static final int DRAWABLE_RIGHT = 4;
    /** 用于保存view的集合 */
    private final SparseArray<View> mViews;
    /** 当前的位置 */
    private int mPosition;
    /** 复用view */
    private final View mConvertView;
    private final Context context;

    /**
     * 构造方法
     *
     * @param context
     * @param parent
     * @param layoutId
     * @param position
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:32:18
     * @updateTime 2015年5月24日, 上午10:32:18
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder(Context context, ViewGroup parent, int layoutId, int position) {
        this.mPosition = position;
        this.context = context;
        this.mViews = new SparseArray<>();
        mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
        mConvertView.setTag(this);
    }

    /**
     * 静态获取对象方法
     *
     * @param context
     * @param convertView
     * @param parent
     * @param layoutId
     * @param position
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:31:47
     * @updateTime 2015年5月24日, 上午10:31:47
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public static ComViewHolder getViewHolder(Context context, View convertView, ViewGroup parent, int layoutId, int position) {
        if (convertView == null) {
            return new ComViewHolder(context, parent, layoutId, position);
        } else {
            ComViewHolder holder = (ComViewHolder) convertView.getTag();
            holder.mPosition = position;
            return holder;
        }
    }

    /**
     * 获取位置
     *
     * @return
     * @version 1.0
     * @createTime 2015年8月12日, 下午12:25:55
     * @updateTime 2015年8月12日, 下午12:25:55
     * @createAuthor chencong
     * @updateAuthor
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public int getPosition() {
        return mPosition;
    }

    /**
     * 通过id获取view
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:36:23
     * @updateTime 2015年5月24日, 上午10:36:23
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    @SuppressWarnings("unchecked")
    public <T extends View> T getView(int viewId) {
        View view = mViews.get(viewId);
        if (view == null) {
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }

    /**
     * 获取convertView
     *
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:37:34
     * @updateTime 2015年5月24日, 上午10:37:34
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public View getConvertVeiw() {
        return mConvertView;
    }

    /**
     * 设置textview的文本
     *
     * @param viewId
     * @param text
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setText(int viewId, CharSequence text) {
        TextView tv = (TextView) getView(viewId);
        if (!TextUtils.isEmpty(text)) {
            tv.setText(text);
        } else {
            tv.setText("");
        }
        return this;
    }
    /**
     * 设置textview的文本
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setTextTime(int viewId, long time) {
        TextView tv = (TextView) getView(viewId);
        tv.setText(TimeUtil.getFormatTime(time,TimeUtil.FORMAT_TIME_MINUTES_TWO));
        return this;
    }
    /**
     * 设置textview的文本
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setCBchecked(int viewId, boolean ischecked) {
        CheckBox tv = (CheckBox) getView(viewId);
        tv.setChecked(ischecked);
        return this;
    }

    /**
     * 设置checkedtextview的文本
     *
     * @param viewId
     * @param text
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setCText(int viewId, CharSequence text) {
        TextView tv = (TextView) getView(viewId);
        if (!TextUtils.isEmpty(text)) {
            tv.setText(text);
        } else {
            tv.setText("");
        }
        return this;
    }

    /**
     * 设置文本[插入后段文本的方法]
     *
     * @param viewId
     * @param text 需要加入的文本
     * @param format 文本格式
     * @return
     * @version 1.0
     * @createTime 2015年8月17日, 下午2:23:49
     * @updateTime 2015年8月17日, 下午2:23:49
     * @createAuthor chencong
     * @updateAuthor
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setMidText(int viewId, CharSequence text, String format) {
        TextView tv = (TextView) getView(viewId);
        if (!TextUtils.isEmpty(text)) {
            tv.setText(String.format(format, text));
        } else {
            tv.setText("");
        }
        return this;

    }

    /**
     * 设置文本[两段颜色不一样时使用]
     *
     * @param viewId 控件id
     * @param line 全部文本
     * @param text 需要变色的文本
     * @param color 需要变色的文本颜色
     * @return
     * @version 1.0
     * @createTime 2015年8月17日, 下午2:22:54
     * @updateTime 2015年8月17日, 下午2:22:54
     * @createAuthor chencong
     * @updateAuthor
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setColorText(int viewId, String line, CharSequence text, int color) {
        SpannableStringBuilder s = new SpannableStringBuilder(text + line);
        Pattern p = Pattern.compile((String) text);
        Matcher m = p.matcher(s);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            s.setSpan(new ForegroundColorSpan(color), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }

        TextView tv = (TextView) getView(viewId);
        if (!TextUtils.isEmpty(line)) {
            tv.setText(s.toString());
        } else {
            tv.setText("");
        }
        return this;

    }

    /**
     * 设置文本[两段颜色不一样时使用]
     *
     * @param viewId 控件id
     * @param line 全部文本 (可能带有表情)
     * @param text 需要变色的文本 (不可以带有表情)
     * @param color 需要变色的文本颜色
     * @return
     * @version 1.0
     * @createTime 2015年8月17日, 下午2:22:54
     * @updateTime 2015年8月17日, 下午2:22:54
     * @createAuthor chencong
     * @updateAuthor
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setColorText2(int viewId, String line, CharSequence text, int color) {
        SpannableStringBuilder s = new SpannableStringBuilder(text);
        s.setSpan(new ForegroundColorSpan(color), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        TextView tv = (TextView) getView(viewId);
        if (!TextUtils.isEmpty(line)) {
            tv.setText(s);
            tv.append(line);
        } else {
            tv.setText("");
        }
        return this;
    }


    public ComViewHolder setOnClickListener(int viewId, OnClickListener ocl) {
        View view = getView(viewId);
        view.setOnClickListener(ocl);
        return this;
    }

    /**
     * 设置Textview的文本颜色
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年8月11日, 下午2:29:21
     * @updateTime 2015年8月11日, 下午2:29:21
     * @createAuthor yanzhongzhong
     * @updateAuthor yanzhongzhong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setTextColor(int viewId, int color) {
        TextView tv = (TextView) getView(viewId);
        tv.setTextColor(context.getResources().getColor(color));
        return this;
    }
    /**
     * 设置Textview的文本颜色
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年8月11日, 下午2:29:21
     * @updateTime 2015年8月11日, 下午2:29:21
     * @createAuthor yanzhongzhong
     * @updateAuthor yanzhongzhong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setBtnTxtColor(int viewId, int color) {
        Button tv = (Button) getView(viewId);
        tv.setTextColor(context.getResources().getColor(color));
        return this;
    }

    /**
     * 设置imageview的图片
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setImageResource(int viewId, int resId) {
        ImageView img = (ImageView) getView(viewId);
        img.setImageResource(resId);
        return this;
    }

    /**
     * 设置imageview的图片
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setImageResource_bg(int viewId, int resId) {
        ImageView img = (ImageView) getView(viewId);
        img.setBackgroundResource(resId);
        return this;
    }

    /**
     * 设置imageview的图片
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setImageBitmap(int viewId, Bitmap bitmap) {
        ImageView img = (ImageView) getView(viewId);
        img.setImageBitmap(bitmap);
        return this;
    }

    /**
     * 设置imageview的图片
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setImageDrawable(int viewId, Drawable drawable) {
        ImageView img = (ImageView) getView(viewId);
        img.setImageDrawable(drawable);
        return this;
    }
    /**
     * 设置imageview的图片
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setRating(int viewId, float s) {
        RatingBar img = (RatingBar) getView(viewId);
        img.setRating(s);
        return this;
    }

    /**
     * 设置imageview的图片
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setImageURI(int viewId, String imagePath) {
        ImageView img = (ImageView) getView(viewId);
        if (!TextUtils.isEmpty(imagePath)) {
            DisplayImageOptions options = new DisplayImageOptions.Builder()
                    .showImageForEmptyUri(R.drawable.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片
                    .showImageOnFail(R.drawable.ic_launcher)  //设置图片加载/解码过程中错误时候显示的图片
                    .cacheInMemory(true)//设置下载的图片是否缓存在内存中
                    .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中
                    .imageScaleType(ImageScaleType.EXACTLY)//设置图片以如何的编码方式显示
                    .build();//不推荐用！！！！是否设置为圆角，弧度为多少
            ImageLoader.getInstance().displayImage(imagePath, img, options);
        }
        return this;
    }
    /**
     * 设置imageview的图片
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setImageLocal(int viewId, String imagePath) {
        ImageView img = (ImageView) getView(viewId);
        if(new File(imagePath).exists()){
           com.kpx.app.utils.ImageLoader.load(Application.mContext,
                   imagePath, img);
        }
        return this;
    }

    /**
     * 设置imageview的图片(带圆角)
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setImageURI_Round(int viewId, String imagePath, int conerdp) {
        ImageView img = (ImageView) getView(viewId);
        if (!TextUtils.isEmpty(imagePath)) {
            DisplayImageOptions options = new DisplayImageOptions.Builder()
                    .showImageForEmptyUri(R.drawable.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片
                    .showImageOnFail(R.drawable.default_head_img2)  //设置图片加载/解码过程中错误时候显示的图片
                    .cacheInMemory(true)//设置下载的图片是否缓存在内存中
                    .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中
                    .displayer(new RoundedBitmapDisplayer(conerdp)).build();//不推荐用！！！！是否设置为圆角，弧度为多少
            ImageLoader.getInstance().displayImage(imagePath, img, options);
        }
        return this;
    }


    /**
     * 设置imageview的图片(背景图片)
     *
     * @param viewId
     * @param resId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setBackgroundResource(int viewId, int resId) {
        ImageView img = getView(viewId);
        img.setBackgroundResource(resId);
        return this;
    }
    /**
     * 设置view的图片(背景图片)
     *
     * @param viewId
     * @param resId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setBackgroundResource_v(int viewId, int resId) {
        View img = getView(viewId);
        img.setBackgroundResource(resId);
        return this;
    }

    /**
     * 设置textview的图片(背景图片)
     *
     * @param viewId
     * @param resId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setBackgroundResource_tv(int viewId, int resId) {
        TextView tv = getView(viewId);
        tv.setBackgroundResource(resId);
        return this;
    }

    /**
     * 设置imageview的颜色(背景颜色)
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setBackgroundColor(int viewId, int color) {
        ImageView img = getView(viewId);
        img.setBackgroundColor(context.getResources().getColor(color));
        return this;
    }
    /**
     * 设置progress进度
     *
     * @param viewId
     * @return
     * @version 1.0
     * @createTime 2015年5月24日, 上午10:56:00
     * @updateTime 2015年5月24日, 上午10:56:00
     * @createAuthor chencong
     * @updateAuthor chencong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setProgress(int viewId, int progress) {
        ProgressBar img = getView(viewId);
        img.setProgress(progress);
        return this;
    }


    /**
     * 设置view是否可见ComViewHolder.VISIBLE ComViewHolder.GONE
     *
     * @param viewId
     * @param visible 1: 可见 2: 不可见 3: 不占用位置
     * @version 1.0
     * @createTime 2015年8月25日, 下午2:31:01
     * @updateTime 2015年8月25日, 下午2:31:01
     * @createAuthor chencong
     * @updateAuthor
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public ComViewHolder setVisibility(int viewId, int visible) {
        switch (visible) {
            case VISIBLE:
                getView(viewId).setVisibility(View.VISIBLE);
                break;
            case INVISIBLE:
                getView(viewId).setVisibility(View.INVISIBLE);
                break;
            case GONE:
                getView(viewId).setVisibility(View.GONE);
                break;
            default:
                break;
        }
        return this;
    }

    /**
     * 返回上下文
     *
     * @return
     * @version 1.0
     * @createTime 2015年8月27日, 上午11:57:02
     * @updateTime 2015年8月27日, 上午11:57:02
     * @createAuthor yanzhongzhong
     * @updateAuthor yanzhongzhong
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public Context getContext() {
        return context;
    }

    /**
     * 设置按钮的文本
     *
     * @param resid
     * @param txt
     * @return
     */
    public ComViewHolder setBtnText(int resid, String txt) {
        Button btn = getView(resid);
        if (btn != null && !TextUtils.isEmpty(txt)) {
            btn.setText(txt);
        }
        return this;
    }

    /**
     * 设置textview的drawable图片
     *
     * @param resid textview 的id
     * @param drawableType 根据类型设置相关方向图片
     * @param drawableRes 图片资源
     * @param drawablePadding 图片距离
     */
    public void setTxtDrawable(int resid, int drawableType, int drawableRes, int drawablePadding) {
        TextView txt = getView(resid);
        Drawable drawable = getContext().getResources().getDrawable(drawableRes);
        drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
        txt.setCompoundDrawablePadding(DisplayUtil.dip2px(getContext(), drawablePadding));
        txt.setCompoundDrawables(drawableType == DRAWABLE_LEFT ? drawable : null,
                drawableType == DRAWABLE_TOP ? drawable : null,
                drawableType == DRAWABLE_RIGHT ? drawable : null,
                drawableType == DRAWABLE_BOTTOM ? drawable : null);
    }


}
